<?php namespace Home\Controller;
use Hdphp\Controller\Controller;
class ListController extends Controller{
	
	public function index(){
		$cid=Q('get.gcid',0,'intval');
		$cate=M('\Common\Model\Gcate')->where('gcid='.$cid)->find();
		View::with('cate',$cate);
		//通过$cid获得所有子类和自己的说有分类
		$cids=(new \Common\Model\Gcate)->getSon(M('\Common\Model\Gcate')->get(),$cid);
		$cids[]=$cid;
		//通过$cids找到所有符合的商品的gids
		$gids=$this->cidsgetGids($cids);
				
	
		
		//把品牌的信息分配到页面
		$brandid=M('\Common\Model\Goods')->where("gid in(".implode(',', $gids).')')->lists('brand_bid');
		//通过获得的$brandid获得所有品牌的内容
		$brandData=M('\Common\Model\Brand')->where("bid in(".implode(',', $brandid).')')->get();
		//分配到页面去
		View::with('brandData',$brandData);
		
		
		//这里是接受品牌提交上来的品牌下的所有品牌的商品然后和所有的商品求交集
		$bid=isset($_GET['bid'])?$_GET['bid']:0;
//		p($bid);		
		View::with('bid',$bid);
		//将获得的$bid对商品标的筛选出对应的gids
		if($bid){
			$bidgid=M('\Common\Model\Goods')->where('brand_bid='.$bid)->lists('gid');
			$gids=array_intersect($bidgid, $gids);
		}
//		p($gids);	
		//通过$gids获得所有商品属性
		$goodsattr=$this->gidsgetAttr($gids);
		View::with('goodsattr',$goodsattr);
		
					
		//处理筛选变量param
		//1.获得分配到页面上的规格有几种这样的话就能对param数组进行0的补全
		$num=count($goodsattr);
		//注：这里不能用q函数来放在isset里面去。这是hd框架的bug
		$param=isset($_GET['param'])?explode('_', Q('get.param')):array_fill(0, $num, 0);
		View::with('param',$param);
//		p($param);
		//获得商品筛选的商品属性然。找到对应的商品id
		$resultgids=$this->filter($param,$gids);
		
		//通过筛选之后的最终gids来获得所有的商品（先对resultgids进行判断是不是为空）
		if($resultgids){
			$goodData=M('\Common\Model\Goods')->join('gooddetail','goods_gid','=','gid')->where("gid in(".implode(',', $resultgids).')')->get();	
			//遍历数组对商品详情的图册转化成数组以便循环
		
			foreach ($goodData as $k => $v) {
				$goodData[$k]['gdimg']=explode(',', $v['gdimg']);
			}
			//分配筛选之后的的商品详细信息
			View::with('goodData',$goodData);
		}
		
		//分配数据	
		//侧面推广的按照降序的排列
		$goodtui=M('\Common\Model\Goods')->orderBy('gsort','desc')->limit(10)->get();		
		View::with('goodtui',$goodtui);
		//分配商品规格				
	    View::make();
	}
	
	//声明一个获得gids的方法
	private function cidsgetGids($cids){
	   $gids=M('\Common\Model\Goods')->where('cate_id in('.implode(',', $cids).')')->lists('gid');
	   //将获得的$gids返回到index页面
	   return $gids;
	}
	//声明一个方法来找出对应gids的商品属性
	private function gidsgetAttr($gids){
		$gattr=M('\Common\Model\Goodsattr')->join('typeattr','taid','=','typeattr_taid')->where('goods_gid in('.implode(',', $gids).')')->groupBy('gavalue')->get();
		//重新组合数组放在对应
		$arr=array();
		foreach ($gattr as $v) {
			$arr[$v['taname']][]=$v;
		}
		//将从组的数组返回
		return $arr;
	}
		
	//声明一个filter方法来对对接收到的param进行处理
	public function filter($param,$cidgid){
		   //生命一个空数组来放置处理以后的gid
		   $gid=array();
		   foreach ($param as $gaid) {
		   		//通过gaid找到对应的商品属性的内容值，因为有可能有别的商品也有该内容的值，例如红色，有可能别的商品也有红色等等，所以我们要通过内容值来找对应的商品id
		   		if($gaid){
		   			$value=M('\Common\Model\Goodsattr')->where('gaid='.$gaid)->pluck("gavalue");
					//接着通过￥value查询到对应商品id
					$gid[]=M('\Common\Model\Goodsattr')->where("gavalue='{$value}'")->lists('goods_gid');
		   		}
		   }
//		  p($gid);		
		  //然后的对获得的$gid内的数组内容进行求交集获得这几种属性都有的商品id
		  //这里加一个if判断。如果都点了‘不限’那么上面就$gid为一个空数组
		  if($gid){
			  $tempgid=$gid[0];
			  foreach ($gid as $v) {
			  	$tempgid=array_intersect($tempgid, $v);
			  }
			//因为根据上面循环的$param找到的商品是有可能属于别的分类下的商品，所以要和本分类下的gid做交集
			return array_intersect($tempgid, $cidgid);
		  }else{
//		  	如果上面都点的不限的话就将所有分类的gid返回				
		  	return $cidgid;
		  }
	}
}

 ?>